# AdministracionSistemasApp

Aplicación demo para las tareas básicas de un Administrador de Sistemas en su entorno de trabajo.

## Descripción
### Datos

Los **datos** usados para la app serían cargados desde un **fichero** contenedor que tendría la siguiente estructura:

	Clase;numero;marca;modelo;procesador;memoria;almacenamiento
	Software;compañia;nombre;version;tienelicencia;tipo

Habrán un bloque con líneas que empiezan con el nombre de una subclase de Equipo y otras seguidas debajo con el software que posee.

### Estructura

Las clases principales y derivados serían:
* EntornoTrabajo
* Equipo
 * Ordenador
 * Servidor
* ComparadorMemoria
* ComparadorAlmacenamiento
* Software
* TipoSoftware

**EntornoTrabajo** representa el lugar que debe administrar el administrador de sistemas.
* Variable para una **colección** de objetos de la clase **Equipo** en forma de **Map**.
* Variable **BufferedReader** y **PrintWriter** para la lectura y la escritura.
* Variables para un **nombre**, un **lugar**, y **una** variable que indica el **número** del **equipo** a medida que se van introduciendo en el entorno de trabajo.
* El constructor inicializa Map como HashMap  y los números a 0, y define la lectura, el nombre y el lugar especificados como parámetros.
* Método **leerEntorno** que lee línea por línea el fichero indicado en la variable de lectura y llama a los métodos correspondientes de la clase. Usa el método reset.
* Método **guardarEntorno** que llama los objetos de cada colección y escribe los valores de sus atributos en el mismo fichero de lectura usando PrintWriter.
* Método **habilitarEquipo** al que se le pasa un objeto de la clase Equipo y la lista de Software añadiéndolo a la lista del entorno de trabajo.
* Método **tirarEquipo** al que se le indica el número de equipo y lo elimina del entorno de trabajo..
* Método **mantenerEquipo** al que se le pasa el número de equipo y los valores de procesador, memoria y almacenamiento a modificar.
* Método **instalarSoftware** al que le pasa compañía, nombre, version, licencia y de forma opcional el número de la colección de equipos en uso. Intenta instalar dicho software en todos los equipos o en uno si se especifica el número indicando si ha fallado o no. Usa el método instalar de la clase Equipo.
* Método **desinstalarSoftware** al que le pasa compañía y nombre, y de forma opcional el número de la colección de equipos en uso. Intenta desinstalar dicho software en todos los equipos o en uno si se especifica el número indicando si ha fallado o no. Usa el método desinstalar de la clase Equipo.
* Método **mantenerSoftware** para el objeto de la clase Equipo indicado intenta actualizar y renovar licencia, y si falla devuelve la compañía y el nombre del software en el que ha fallado. Usa los métodos actualizarVersion y renovarLicencia de la clase Software.
* Método **buscarNumero** que devuelve un objeto de la clase Equipo que tenga el número correspondiente en la lista.
* Método **buscarProcesador** que devuelve una lista de objetos de la clase Equipo que tengan el procesador indicado.
* Método **buscarMemoria** que devuelve una lista de objetos de la clase Equipo que tengan más o igual cantidad de memoria RAM a la indicada.
* Método **buscarAlmacenamiento** que devuelve una lista de objetos de la clase Equipo que tenga más o igual capacidad de almacenamiento a la indicada.
* Método **buscarSoftware** que devuelve una lista de objetos de la clase Equipo que tenga un objeto de la clase Software correspondiente en sus listas.
* Método **privado** **reset** que pone los valores de la lista de equipos y el número a los originales.
* Método **toString** con los atributos del objeto y los objetos de las colecciones.
* Método **ordenarEquipos** que devuelven lista de equipos ordenada según la cantidad la marca y el modelo, la cantidad de memoria RAM o la capacidad de almacenamiento.
* Método **imprimirEquipos** que imprime los equipos en base a uno o lista indicados.

**Equipo** es una clase abstracta que representa un equipo del lugar de trabajo.
* Variable para una **colección** de **software** de tipo **List**.
* Variables para una **marca**, un **modelo**, tipo de **procesador**, **memoria** RAM en MB y capacidad de **almacenamiento** en GB.
* El constructor inicializa List como ArrayList y define por parámetros el resto de atributos.
* Métodos **getter** para **todos** sus atributos.
* Métodos **setter** para el procesador, el almacenamiento y la memoria.
* Método **abstracto** **instalar** al que se le pasa un objeto de la clase Software y lo introduce en la colección. Usa el método cuantoSoftware.
* Método **abstracto** **desinstalar** al que se le pasa la posicion de la lista de software y lo elimina. Usa el método cuantoSoftware.
* Método **mantener** al que se le pasa un objeto de la clase Software de la lista de software e intenta actualizar y renovar la licencia.
* Método **protegido** **cuantoSoftware** que devuelve un vector indicando el software de cada tipo que está en la lista.
* Método **ordenar** que ordena la lista de software.
* Método **toString** que devuelve la información de sus atributos y de los objetos de la colección.
* Método **compareTo** que permite ordenar cada objeto de la clase en base a la marca y el modelo.

**Ordenador** y **Servidor** son clases derivadas de Equipo que incluyen diferencias en los métodos instalar y desinstalar.
* El constructor no se altera en comparación con la clase padre.
* Método **instalar**: 
 * Ordenador solo permite añadir un objeto de la clase Software del tipo Sistema Operativo. 
 * Servidor no tiene límite para el tipo Sistema Operativo pero solo puede instalar 2 del tipo Aplicación.
* Método **desinstalar**: 
 * Ordenador sólo puede eliminar objetos de la clase Software del tipo Aplicacion y si se intenta el del tipo Sistema Operativo, se borran los objetos del tipo Aplicacion.
 * Servidor puede eliminar un objeto de la clase Software del tipo Aplicacion y puede eliminar objetos del Sistema Operativo dejando al menos 1 pero sin eliminar objetos del tipo Aplicacion.

**ComparadorMemoria** y **ComparadorAlmacenamiento** son clases que implementan la interfaz Comparator para los equipos. 
* Método **compare**: 
 * ComparadorMemoria compara dos objetos de la clase Equipo en base a su cantidad de memoria RAM.
 * ComparadorAlmacenamiento compara dos objetos de la clase Equipo en base a su capacidad de almacenamiento

**Software** es una clase que define el software que se usará en los equipos.
* Variables para el nombre de la **compañía**, el **nombre**, una **versión**, **licencia** (opcional) y un **tipo**.
* El constructor define por parámetros la compañía, el nombre y la versión numérica, define la licencia si se indicase que tiene y el tipo indicando si es o no sistema operativo. Usa el método generarLicencia.
* Método **getter** para **todos** sus atributos.
* Método **actualizarVersion** que incrementa el número de la versión de forma aleatoria entre dos pequeños valores y devuelve o no si se pudo hacer. Usa el método estaObsoleto.
* Método **privado** **estaObsoleto** que devuelve de forma aleatoria si la versión actual del software necesita o no ser actualizada.
* Método **renovarLicencia** que define una nueva licencia si la actual está caducada y devuelve si se pudo o no hacer también de forma aleatoria. Usa los métodos estaCaducado y generarLicencia.
* Método **privado** **estaCaducado** que devuelve de forma aleatoria si la licencia está caducada o no.
* Método **privado** **generarLicencia** que genera un nuevo código de licencia de forma aleatoria.
* Método **toString** que devuelve la información de sus atributos.
* Método **compareTo** que usa como criterios una cadena formada por el tipo, compañía, nombre y versión.
* Método **equals** que indica que un objeto de la clase software es idéntico si los parámetros no nulos lo son, ignorando el resto.

**TipoSoftware** es un **enum** con los valores “**SISTEMAOPERATIVO**” y “**APLICACION**”.
